﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Metro;
using ProductManagement.Ultilities;

namespace ProductManagement.Forms
{
    public partial class ExportForm : MetroForm
    {
        #region Các biến

        /// <summary>
        /// ID của báo cáo mà MainForm truyền vào
        /// </summary>
        private int _rid;
        /// <summary>
        /// Đối tượng kiểm tra tính hợp lệ của dữ liệu nhập vào
        /// </summary>
        private Validator validator = new Validator();
        /// <summary>
        /// Đối tượng liên kết dữ liệu LinQ to SQL, để thao tác với cơ sở dữ liệu
        /// </summary>
        private ProductManagementClassesDataContext db = new ProductManagementClassesDataContext();
        /// <summary>
        /// Form chính đang chạy
        /// </summary>
        private MainForm _mainForm;

        #endregion

        #region Hàm khởi tạo

        /// <summary>
        /// Hàm khởi tạo không tham số
        /// </summary>
        public ExportForm()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Hàm khởi tạo 2 tham số
        /// </summary>
        /// <param name="reportID">ID của báo cáo xuất sản phẩm</param>
        /// <param name="mainForm">MainForm gọi form này</param>
        public ExportForm(int reportID, MainForm mainForm)
        {
            _rid = reportID;
            _mainForm = mainForm;
            InitializeComponent();
        }

        #endregion

        #region Các phương thức khác

        /// <summary>
        /// Kiểm tra tính hợp lệ của số lượng sản phẩm xuất ra được nhập vào
        /// </summary>
        /// <param name="productID">ID của sản phẩm được chọn để xuất</param>
        /// <returns>true nếu hợp lệ, false nếu không hợp lệ</returns>
        private bool ValidateExportQuantity(int productID)
        {
            if (validator.ValidateQuantity(txtExportQuantity, errorProvider1))
            {
                int oldQuantity = db.sp_GetProductQuantity(productID).SingleOrDefault().quantity;
                int exportQuantity = Int32.Parse(txtExportQuantity.Text);
                if (exportQuantity > oldQuantity)
                {
                    errorProvider1.SetError(txtExportQuantity, "Số lượng xuất không được lớn hơn số lượng sản phẩm trong kho");
                    return false;
                }
                else
                    return true;
            }
            else
                return false;
        }

        #endregion

        #region Xử lý sự kiện

        /// <summary>
        /// Sự kiện nhấn nút Xuất 
        /// </summary>
        private void btnAddExport_Click(object sender, EventArgs e)
        {
            try
            {
                //Lấy chỉ số hàng của ô đang được chọn
                int rowIndex = dgvExportProduct.SelectedCells[0].RowIndex;
                //Lấy ID, tên, giá sản phẩm được chọn từ datagridview
                int productID = (int)dgvExportProduct[0, rowIndex].Value;
                string name = dgvExportProduct[1, rowIndex].Value.ToString();
                decimal price = (decimal)dgvExportProduct[2, rowIndex].Value;
                if (ValidateExportQuantity(productID))
                {
                    DialogResult dr = MessageBoxEx.Show("Bạn có muốn xuất sản phẩm này?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (dr == DialogResult.Yes)
                    {
                        //Số lượng xuất
                        int exportQuantity = Int32.Parse(txtExportQuantity.Text);
                        //Số lượng sản phẩm cũ
                        int oldQuantity = (int)dgvExportProduct[3, rowIndex].Value;
                        //Cập nhật số lượng sản phẩm vào cơ sở dữ liệu
                        db.sp_UpdateProductQuantity(oldQuantity - exportQuantity, productID);
                        //Thêm 1 chi tiết báo cáo
                        db.sp_InsertReportDetail(_rid, name, price, exportQuantity);
                        _mainForm.DisplayExportImportInfo(_rid);
                        MessageBoxEx.Show("Xuất sản phẩm thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        db.SubmitChanges();
                    }
                }
            }
            catch (ArgumentOutOfRangeException)
            {

            }
            catch (Exception ex)
            {
                MessageBoxEx.Show(ex.ToString(), "Ngoại lệ", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                dgvExportProduct.DataSource = db.sp_GetAllProducts();
            }
        }

        /// <summary>
        /// Sự kiện nhấn nút OK (thoát form Xuất sản phẩm)
        /// </summary>
        private void btnOK_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// Sự kiện load form
        /// </summary>
        private void ExportForm_Load(object sender, EventArgs e)
        {
            //Load dữ liệu toàn bộ thông tin sản phẩm vào datagridview 
            dgvExportProduct.DataSource = db.sp_GetAllProducts();
        }

        /// <summary>
        /// Sự kiện thoát form
        /// </summary>
        private void ExportForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            //Nếu báo cáo xuất sản phẩm (được tạo khi gọi form) không chứa chi tiết báo cáo nào 
            //thì xóa báo cáo đó đi
            int count = (int)db.sp_GetReportDetailsCount(_rid).SingleOrDefault().dem;
            if (count == 0)
                db.sp_DeleteReport(_rid);
            db.SubmitChanges();
        }

        /// <summary>
        /// Sự kiện giá trị trường số lượng xuất thay đổi
        /// </summary>
        private void txtExportQuantity_TextChanged(object sender, EventArgs e)
        {
            errorProvider1.Dispose();
        }

        /// <summary>
        /// Sự kiện click chuột vào 1 ô của datagridview dgvExportProduct
        /// </summary>
        private void dgvExportProduct_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            errorProvider1.Dispose();
        }

        #endregion
    }
}
